package com.slt.concurrency.mashibing2019.juc.c_007_LockAndTools;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 实现一个容器，提供两个方法，add,size。写两个线程，
 * 线程1添加10个元素到容器中，
 * 线程2实现监控元素的个数，当个数到5个时，线程2给出提示并结束线程2。
 *
 * wait notify 必须配合synchronized 使用
 */
public class T14_WaitNotify {
	static class MyContainer{
		volatile List lists = new ArrayList();
		public void add(Object o) {
			lists.add(o);
		}
		public int size() {
			return lists.size();
		}
	}

	public static void main(String[] args) {
		MyContainer container = new MyContainer();
		Object lock = new Object();
		//线程1
		new Thread(()->{
			for (int i = 0; i < 10; i++) {
				synchronized (lock){
					container.add(i);
					if(i == 5){
						lock.notify();
						try {
							lock.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					System.out.println(Thread.currentThread().getName() + ": " + i);
					try {
						TimeUnit.MILLISECONDS.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		},"t1").start();

		//线程2
		new Thread(()->{
			synchronized (lock){
				try {
					//监控线程 上来先wait，等待t1 size等于5的时候，通知他
					lock.wait();
					lock.notify();
					System.out.println("t2 结束");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		},"t2").start();
	}
}
